package gui;

import controller.SearchController;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import service.FileMeta;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-07-01
 * Time: 21:02
 */
//
public class GUIController implements Initializable {

    @FXML
    private GridPane gridPane;

    @FXML
    private Button button;

    @FXML
    private Label label;

    @FXML
    private TextField textField;

    // 作为一个类似集合类, 这里的输入框中的内容展示的是一个 FileMeta 对象来描述的
    @FXML
    private TableView<FileMeta> tableView;

    private SearchController searchController = null;

    private SearchController searchController1 = new SearchController();

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        // 图形化界面的文本检监听器
        // 需要指定是针对那个内容的属性来进行监听, 例如此处是 text
        textField.textProperty().addListener(new ChangeListener<String>() {
            /**
             *  根据新的值, 进行重新查询操作
             * @param observable
             * @param oldValue 输入框修改之前的值
             * @param newValue 输入框修改之后的值
             */
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                // 在每次用户修改输入框内容时被自动调用到
                freshTable(newValue);
            }
        });

        // 新增一个鼠标点击事件
        tableView.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                // 双击事件
                if (event.getClickCount() == 2) {
                    // 点击获取图形化界面中的参数
                    FileMeta selectedFile = tableView.getSelectionModel().getSelectedItem();
                    if (selectedFile != null) {
                        String filePath = selectedFile.getPath();
                        if (Desktop.isDesktopSupported()) {
                            try {
                                Desktop.getDesktop().open(new File(filePath));
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        });
    }

    /**
     *
     * @param key
     */
    private void freshTable(String key) {
        // 通过该方法重新查询数据库, 也就是关键词查询
//        if (searchController == null) {
//            System.out.println("当前内容还没首次初始化, 请选择文件目录后再查询 !");
//            return;
//        }

        // 把之前表格中, 旧的内容清空.
        ObservableList<FileMeta> fileMetas = tableView.getItems(); // 获取 tableView 中的所有字段
        fileMetas.clear(); // 清空内容

        // 重新查询
        List<FileMeta> fileMetaList = searchController1.search(key);

        fileMetas.addAll(fileMetaList); // 全部添加进本文框中
    }

    /**
     * 给 button 按钮新增一个点击事件
     * 作为鼠标点击事件的回调方法.
     *
     * @param mouseEvent 鼠标点击的内容存在该参数中
     */
    public void choseDirectory(MouseEvent mouseEvent) {

        // JavaFX 封装的一个目录选择器
        DirectoryChooser chooser = new DirectoryChooser();

        // 要显示弹出这个文件选择框, 需要有一个父类窗口, 这里为程序窗口
        Window window = gridPane.getScene().getWindow();

        // 显示文件选择器对话框
        File file = chooser.showDialog(window);

        // 将当前用户选择的文件目录存起来.
        if (file == null) {
            System.out.println("当前用户已取消选择文件");
            return;
        }
        System.out.println(file);

        // 选择后再 label 中展示路径
        label.setText(file.getAbsolutePath());

        // 判断当前 searchController 对象是否为 null, 非空说明非首次扫描
        // 则停止上次扫描任务
        if (searchController != null) {
            System.out.println("非首次扫描");
            searchController.shutdown();
            //searchController1.shutdown();

        }

        // 对用户选择的文件进行扫描存储到数据库
        searchController = new SearchController();
        searchController.init(file.getAbsolutePath());
    }
}
